package com.flong.thrift;

import org.apache.thrift.protocol.TJSONProtocol;
import org.apache.thrift.protocol.TMultiplexedProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import com.flong.utils.PropertiesLoader;

/**
 * @Description	ThriftClient
 * @ClassName	ThriftClient
 * @Date		2018年1月18日 下午3:06:09
 * @Author		liangjl
 * @Copyright (c) All Rights Reserved, 2018.
 */
public class ThriftClient {

	private String 	serverIp = PropertiesLoader.getVal("thrift.serverIp");
	private Integer serverPort = PropertiesLoader.getInteger("thrift.serverPort");
	private Integer serverTimeout = PropertiesLoader.getInteger("thrift.serverTimeout");
	
	private volatile static ThriftClient instance;
	private TTransport transport;

	/**
	 * @Description 单利模式
	 * @Author		liangjl
	 * @Date		2018年1月18日 下午3:05:35
	 * @return 参数
	 * @return ThriftClient 返回类型 
	 * @throws
	 */
	public static ThriftClient getInstance() {
		if (instance == null) { // Single Checked
			synchronized (ThriftClient.class) {
				if (instance == null) { // Double Checked
					instance = new ThriftClient();
				}
			}
		}
		return instance;
	}

	public ThriftClient(TTransport transport) {
		this.transport = transport;
	}

	public ThriftClient() {
		this(null);
	}

	/**
	 * @Description getName定义的返回值有关，由于底层封装协议是这样处理#ThriftApplicationListener 
	 * @Author liangjl 
	 * @Date 2018年1月18日 上午11:30:43 
	 * @param serviceName这个值跟实现RPC的实现类的getName的返回值有关，由于底层封装协议是处理规定,@see #ThriftApplicationListener 
	 * 返回类型 @throws
	 */
	public TMultiplexedProtocol createProtocolHandler(String serviceName) {
		try {
			
			transport = new TSocket(serverIp, serverPort, serverTimeout);
			transport.open();
			// 协议要和服务端一致#ThriftConfiguration的jProtocolFactory
			TJSONProtocol protocol = new TJSONProtocol(transport);
			/**
			 * personServiceProcessor跟getName定义的返回值有关，由于底层封装协议是这样处理#ThriftApplicationListener
			 * 
			 * @link com.flong.thrift.impl#PersonServiceImpl#getName
			 * 
			 */
			return new TMultiplexedProtocol(protocol, serviceName);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 
	 * @Description 关闭资源 
	 * @Author liangjl 
	 * @Date 2018年1月18日 上午11:29:00 参数 
	 * @return void
	 * 返回类型 @throws
	 */
	public void close() {
		transport.close();
	}

}
